from django.shortcuts import render
from langchain.agents import ZeroShotAgent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from rest_framework.response import Response
from rest_framework.views import APIView

from home.models import Jobposting
from user.models import Company, JobInfo, CollectCompany

# Create your views here.


"""
agent:
查询某个城市所有的岗位
查询某个公司详细信息
某个人收藏了哪些公司

"""


@tool(
    description="用于查询某个城市所有的岗位。参数：city（必填，城市名称，示例：上海，北京），返回值：岗位列表。只要是查询某个城市的岗位,必须调用这个方法,不能编造数据")
def FindJobByCity(city: str) -> list:
    query_set = Jobposting.objects.filter(city__name=city)
    job_list = []
    for job in query_set:
        job_info = {
            "职位名称": job.title,
            "职位薪资": job.money,
            "职位类型": job.get_type_display(),
            "职位经验": job.get_working_display(),
            "职位描述": job.description,
            "职位学历": job.education,
            "职位城市": job.city.name,
            "职位标签": job.label,
            "职位收藏数量": job.collect_number,
            "职位浏览数量": job.browse_number,
            "职位投递数量": job.deliver_number,
            "职位公司名称": job.company.name
        }
        job_list.append(job_info)
    return job_list


@tool(
    description="用于查询某个公司详细信息。参数：company_name（必填，公司名称，示例：百度，阿里），返回值：公司信息。只要是查询某个公司的信息,必须调用这个方法,不能编造数据")
def FindInfoByCompany(company_name: str) -> str:
    try:
        company = Company.objects.get(name=company_name)
        company_info = f"""
        公司名称：{company.name}
        公司logo：{company.logo}
        招聘职位数量：{company.job_number}
        """
        return company_info
    except Company.DoesNotExist:
        return f"未找到公司名称为 {company_name} 的公司信息"


@tool(
    description="用于查询某个用户收藏的职位。参数：user_id（必填，用户id，示例：1），返回值：职位列表。只有当用户明确要求查询其收藏的职位时才调用这个方法，不要在其他查询中主动调用")
def FindCollectCompanyByUser(user_id: int) -> list:
    try:
        jobInfo = JobInfo.objects.get(user_id=user_id)
        query_set = CollectCompany.objects.filter(jobinfo=jobInfo)
        company_list = []
        for collect_company in query_set:
            company_info = {
                "公司id": collect_company.company.id,
                "公司名称": collect_company.company.name
            }
            company_list.append(company_info)
        return company_list
    except JobInfo.DoesNotExist:
        return []


tools = [FindJobByCity, FindInfoByCompany, FindCollectCompanyByUser]

prompt_template = """
你是一个帮助用户解决问题的智能助手，你拥有以下工具:
{tools}

使用规则:
1:先理解问题:无需工具则直接回答,需要工具则调用工具(根据工具的描述匹配)
2:调用工具必须用格式：```json{{"name":"工具名","parameters":{{"参数名":"参数值"}}}}```（参数需齐全）；
3. 根据用户问题的类型选择合适的工具：
   - 当用户询问某个城市的岗位信息时，使用 FindJobByCity 工具
   - 当用户询问某个公司的详细信息时，使用 FindInfoByCompany 工具
   - 只有当用户明确要求查询其收藏的公司或职位时，才使用 FindCollectCompanyByUser 工具
4. 对于查询城市岗位的请求，先获取岗位列表，然后可以根据需要获取每个岗位的公司详细信息
5. 拿到工具结果后, 判断是否继续调用工具, 如果需要继续调用工具,则调用工具,否则整理,返回结果;
6. 不要假设用户想要查询收藏信息，除非用户明确提及


用户的问题:{input}



"""

prompt = PromptTemplate(
    input_variables=["input", "tools"],
    template=prompt_template
)

llm = ChatOpenAI(
    model_name="qwen-plus",
    api_key="sk-6434b554122c4b049ceb805d703f695b",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

agent = ZeroShotAgent.from_llm_and_tools(
    llm=llm,
    tools=tools,
    prompt=prompt,
    verbose=True
)
# 构建执行器
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=5,
)


class AgentView(APIView):
    def post(self, request):
        user_id = request.data.get("user_id")
        question = request.data.get("question")
        print(f"用户ID:{user_id},咨询问题:{question}")
        res = agent_executor.invoke({"input": f"用户ID:{user_id},咨询问题:{question}"})
        return Response({
            "问题": res["input"],
            "回答": res["output"]
        })
